Datos

Del paquete igraph seleccionamos el set de datos macaque. Estos datos consisten de un modelo de grafos para las Ă¡reas visotĂ¡ctiles y conexiones del cerebro del mono macaco. El modelo consta de 45 Ă¡reas y 463 conexiones dirigidas.

# Cargamos librerĂ­as
library(tidyverse)
## ── Attaching packages ────────────────────────────────────────────────────── tidyverse 1.2.1 ──
## ✔ ggplot2 3.1.0     ✔ purrr   0.2.5
## ✔ tibble  1.4.2     ✔ dplyr   0.7.8
## ✔ tidyr   0.8.2     ✔ stringr 1.3.1
## ✔ readr   1.3.0     ✔ forcats 0.3.0
## ── Conflicts ───────────────────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
library(tidygraph)
## 
## Attaching package: 'tidygraph'
## The following object is masked from 'package:stats':
## 
##     filter
library(ggraph)
library(igraphdata)

# Cargamos los datos 
data("macaque")

# Extraemos componentes 
componentes <- igraph::decompose(macaque)
componente_grande <- componentes[[1]]

# Estructura de red y medidas de importancia 
mono_macaque <- componente_grande %>% #nodos 
  as_tbl_graph() %>% # convierte a tbl_graph
  activate(edges) %>% # activa aristas 
  mutate(weights = 1) %>% # pone el mismo peso para todos los nodos 
  activate(nodes) %>%  # activa los nodos 
  mutate(imp_Betweeness = centrality_betweenness(), # medidas de centralidad
         imp_Closeness = centrality_closeness(),
         imp_Eigenvec = centrality_eigen())

# Imprime red 
mono_macaque
## # A tbl_graph: 45 nodes and 463 edges
## #
## # A directed simple graph with 1 component
## #
## # Node Data: 45 x 5 (active)
##   shape  name  imp_Betweeness imp_Closeness imp_Eigenvec
##   <chr>  <chr>          <dbl>         <dbl>        <dbl>
## 1 square V1              2.01       0.00980        0.452
## 2 square V2             26.7        0.0127         0.782
## 3 square V3             36.9        0.0128         0.831
## 4 square V3A             8.64       0.0116         0.765
## 5 square V4            163.         0.0133         0.867
## 6 square V4t             2.84       0.0106         0.526
## # ... with 39 more rows
## #
## # Edge Data: 463 x 3
##    from    to weights
##   <int> <int>   <dbl>
## 1     1     2       1
## 2     1     3       1
## 3     1     4       1
## # ... with 460 more rows

¿CuĂ¡les son los nodos mĂ¡s importantes?

Considera betweeness, closeness, centralidad de eigenvector.

Betweeness

# Ordena por importancia betweeness
nodos_imp<- mono_macaque %>% # datos 
  activate(nodes) %>% # acitva nodos 
  as_tibble() %>% # convierte a tibble
  select(shape,name,imp_Betweeness)%>% # selecciona variables
  arrange(desc(imp_Betweeness)) # ordena por betweeness

nodos_imp 
## # A tibble: 45 x 3
##    shape  name  imp_Betweeness
##    <chr>  <chr>          <dbl>
##  1 square VIP            347. 
##  2 square 46             249. 
##  3 square V4             163. 
##  4 circle 7b             153. 
##  5 circle SII            152. 
##  6 square LIP            132. 
##  7 square FEF            112. 
##  8 square TF              98.3
##  9 circle Ig              83.3
## 10 square 7a              81.2
## # ... with 35 more rows
# Barplot de la importancia betweeness
qplot(pull(nodos_imp, imp_Betweeness),bins=50)

Closeness

# Ordena por importancia closeness 
nodos_imp<-mono_macaque %>% # datos 
  activate(nodes) %>% # acitva nodos 
  as_tibble() %>% # convierte a tibble
  select(shape,name,imp_Closeness)%>% # selecciona variables
  arrange(desc(imp_Closeness)) # ordena por closeness

nodos_imp 
## # A tibble: 45 x 3
##    shape  name   imp_Closeness
##    <chr>  <chr>          <dbl>
##  1 square 46            0.0147
##  2 square LIP           0.0143
##  3 square VIP           0.0141
##  4 square FEF           0.0141
##  5 square TF            0.0137
##  6 square V4            0.0133
##  7 square MSTd/p        0.0133
##  8 square FST           0.0133
##  9 square MT            0.0132
## 10 square V3            0.0128
## # ... with 35 more rows
# Barplot de la importancia closeness
qplot(pull(nodos_imp, imp_Closeness),bins=50)

Eigenvector

# Ordena por importancia eigenvector 
nodos_imp<-mono_macaque %>% # datos 
  activate(nodes) %>% # acitva nodos 
  as_tibble() %>% # convierte a tibble
  select(shape,name,imp_Eigenvec)%>% # selecciona variables
  arrange(desc(imp_Eigenvec)) # ordena por eigenvector

nodos_imp
## # A tibble: 45 x 3
##    shape  name   imp_Eigenvec
##    <chr>  <chr>         <dbl>
##  1 square LIP           1    
##  2 square FEF           0.976
##  3 square FST           0.944
##  4 square MT            0.936
##  5 square MSTd/p        0.935
##  6 square VIP           0.881
##  7 square V4            0.867
##  8 square V3            0.831
##  9 square VP            0.797
## 10 square PO            0.793
## # ... with 35 more rows
# Barplot de la importancia eigenvector
qplot(pull(nodos_imp, imp_Eigenvec),bins=50)

Grafica de la Red

Grafica (ggraph o visNetwork) usando un algoritmo de fuerza y mostrando con tamaño y/o color las importancias. Si tu grĂ¡fica es muy grande puedes exportar a gml para utilizar Gephi (ver notas).

Betweeness

ggraph(mono_macaque, layout = 'nicely') +
  geom_edge_link(alpha=0.2) +
  geom_node_point(aes(size = imp_Betweeness, colour = imp_Betweeness)) +
  geom_node_text(aes(label = name), nudge_y = 0.1, size=5) +
  theme_graph(base_family = 'sans')+
  ggtitle("Importancia por Betweeness")+
  theme(plot.title = element_text(hjust=0.5))

Closeness

ggraph(mono_macaque, layout = 'nicely') +
  geom_edge_link(alpha=0.2) +
  geom_node_point(aes(size = imp_Closeness, colour = imp_Closeness)) +
  geom_node_text(aes(label = name), nudge_y = 0.1, size=5) +
  theme_graph(base_family = 'sans')+
  ggtitle("Importancia por Closeness")+
  theme(plot.title = element_text(hjust=0.5))

Eigenvectores

ggraph(mono_macaque, layout = 'nicely') +
  geom_edge_link(alpha=0.2) +
  geom_node_point(aes(size = imp_Eigenvec, colour = imp_Eigenvec)) +
  geom_node_text(aes(label = name), nudge_y = 0.1, size=5) +
  theme_graph(base_family = 'sans')+
  ggtitle("Importancia por Eigenvectores")+
  theme(plot.title = element_text(hjust=0.5))

Combinando medidas

ggraph(mono_macaque, layout = 'nicely') +
  geom_edge_link(alpha=0.2) +
  geom_node_point(aes(size = imp_Betweeness, colour = imp_Eigenvec)) +
  geom_node_text(aes(label = name), nudge_y = 0.2, size=3) +
  theme_graph(base_family = 'sans')+
  ggtitle("Importancia por Betweeness y Eigenvectores")+
  theme(plot.title = element_text(hjust=0.5))

ggraph(mono_macaque, layout = 'nicely') +
  geom_edge_link(alpha=0.2) +
  geom_node_point(aes(size = imp_Betweeness, colour = imp_Closeness)) +
  geom_node_text(aes(label = name), nudge_y = 0.2, size=3) +
  theme_graph(base_family = 'sans')+
  ggtitle("Importancia por Betweeness y Closeness")+
  theme(plot.title = element_text(hjust=0.5))

ggraph(mono_macaque, layout = 'nicely') +
  geom_edge_link(alpha=0.2) +
  geom_node_point(aes(size = imp_Eigenvec, colour = imp_Closeness)) +
  geom_node_text(aes(label = name), nudge_y = 0.2, size=3) +
  theme_graph(base_family = 'sans')+
  ggtitle("Importancia por Eigenvector y Closeness")+
  theme(plot.title = element_text(hjust=0.5))

library(visNetwork)

edges<-mono_macaque%>%activate(edges)%>%as_data_frame
nodes<-mono_macaque%>%activate(nodes)%>%as_data_frame

nodos<-sort(union(unique(nodes$from),unique(nodes$to)))

set.seed(3464)

red_vis<-visNetwork(nodes=data_frame(id=1:length(nodos),label=nodos),edges,width="100%")%>%
  visEdges(arrows = 'to', smooth =T)  %>%
  visPhysics(solver="forceAtlas2Based",
             forceAtlas2Based = list(gravitationalConstant=-50, 
                                     centralGravity=0.01,
                                     springLength=100,
                                     springConstant=0.08, 
                                     avoidOverlap=1))

red_vis